package com.pj.utils.sg;

import java.util.Arrays;
import java.util.List;

/**
 * Ajax发生异常时，直接抛出此异常即可   （比AjaxException更先进的版本）
 *
 * @author kong
 */
public class AjaxError extends RuntimeException {


    /** 以下元素会在isNull函数中被判定为Null， */
    public static final Object[] NULL_ELEMENT_ARRAY = {null, "", 0, "0", "0.0"};
    public static final List<Object> NULL_ELEMENT_LIST;
    private static final long serialVersionUID = 1L;


    // ========================= 定义属性 =========================

    static {
        NULL_ELEMENT_LIST = Arrays.asList(NULL_ELEMENT_ARRAY);
    }

    private int code = 500;        // 底层code码

    public AjaxError(int code, String message) {
        super(message);
        setCode(code);
    }

    public AjaxError(String message) {
        super(message);
    }


    // ========================= 构造方法 =========================

    public AjaxError(Throwable e) {
        super(e);
    }

    public AjaxError(String message, Throwable e) {
        super(message, e);
    }

    /** 获得一个异常AjaxError */
    public static AjaxError get(String errorMsg) {
        return new AjaxError(errorMsg);
    }

    /** 获得一个异常AjaxError */
    public static AjaxError get(int code, String errorMsg) {
        return new AjaxError(code, errorMsg);
    }


    // ========================= 获取相关 =========================

    /** 获得一个异常AjaxError */
    public static AjaxError get(Throwable e) {
        return new AjaxError(e);
    }

    /** 获得一个异常，并直接抛出 */
    public static void getAndThrow(String errorMsg) {
        throw new AjaxError(errorMsg);
    }

    /** 如果条件为true，则抛出异常 */
    public static void throwBy(boolean bo, int code, String errorMsg) {
        if (bo) {
            throw get(code, errorMsg);
        }
    }


    // ========================= 获取并抛出 =========================

    /** 如果条件为true，则抛出异常 */
    public static void throwBy(boolean bo, String errorMsg) {
        if (bo) {
            throw get(errorMsg);
        }
    }

    /** 如果条件为true，则抛出异常 */
    public static void throwBy(boolean bo) {
        if (bo) {
            throw get("error");
        }
    }

    /** 根据受影响行数的(大于0通过，小于等于0抛出error) */
    public static void throwByLine(int line, int code, String errorMsg) {
        if (line <= 0) {
            throw get(code, errorMsg);
        }
    }

    /** 根据受影响行数的(大于0通过，小于等于0抛出error) */
    public static void throwByLine(int line, String errorMsg) {
        if (line <= 0) {
            throw get(errorMsg);
        }
    }

    /** 根据受影响行数的(大于0通过，小于等于0抛出error) */
    public static void throwByLine(int line) {
        if (line <= 0) {
            throw get("受影响行数：0");
        }
    }

    /** 抛出异常，根据: 是否为空 */
    public static void throwByIsNull(Object value, int code, String errorMsg) {
        if (isNull(value)) {
            throw get(code, errorMsg);
        }
    }

    /** 抛出异常，根据: 是否为空 */
    public static void throwByIsNull(Object value, String errorMsg) {
        if (isNull(value)) {
            throw get(errorMsg);
        }
    }

    /** 抛出异常，根据: 是否为空 */
    public static void throwByIsNull(Object value) {
        if (isNull(value)) {
            throw get("不能为空");
        }
    }

    /**
     * 指定值是否为以下其一：null、""、0、"0"
     */
    public static boolean isNull(Object value) {
        return NULL_ELEMENT_LIST.contains(value);
    }

    /**
     * @return 获取code码
     */
    public int getCode() {
        return code;
    }

    /**
     * @return 写入code码 ，连缀风格
     */
    public AjaxError setCode(int code) {
        this.code = code;
        return this;
    }

}
